From: Po Lu Date: Wed, 8 Dec 2021 10:29:05 +0000 (+0800) Subject: Improve precision scroll interpolation X-Git-Tag: archive/raspbian/1%29.2+1-2+rpi1^2~5^2~16^2~4047^2~14 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:///%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:/?a=commitdiff_plain;h=d8c383b25edce88a0812edafc349e360d8d03dc9;p=emacs.git Improve precision scroll interpolation * lisp/pixel-scroll.el (pixel-scroll-precision-interpolation-total-time) (pixel-scroll-precision-interpolation-factor): Add better default values. (pixel-scroll-precision-interpolate): Save deltas and run loop inside `while-no-input' instead. --- diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index af21f365b38..b322bf9a53d 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -141,13 +141,13 @@ Nil means to not interpolate such scrolls." number) :version "29.1") -(defcustom pixel-scroll-precision-interpolation-total-time 0.01 +(defcustom pixel-scroll-precision-interpolation-total-time 0.1 "The total time in seconds to spend interpolating a large scroll." :group 'mouse :type 'float :version "29.1") -(defcustom pixel-scroll-precision-interpolation-factor 2.0 +(defcustom pixel-scroll-precision-interpolation-factor 4.0 "A factor to apply to the distance of an interpolated scroll." :group 'mouse :type 'float @@ -544,20 +544,35 @@ animation." (let ((percentage 0) (total-time pixel-scroll-precision-interpolation-total-time) (factor pixel-scroll-precision-interpolation-factor) + (last-time (float-time)) (time-elapsed 0.0) - (between-scroll 0.001)) - (while (< percentage 1) - (sit-for between-scroll) - (setq time-elapsed (+ time-elapsed between-scroll) - percentage (/ time-elapsed total-time)) - (if (< delta 0) - (pixel-scroll-precision-scroll-down - (ceiling (abs (* (* delta factor) - (/ between-scroll total-time))))) - (pixel-scroll-precision-scroll-up - (ceiling (* (* delta factor) - (/ between-scroll total-time))))) - (redisplay t)))) + (between-scroll 0.001) + (rem (window-parameter nil 'interpolated-scroll-remainder)) + (time (window-parameter nil 'interpolated-scroll-remainder-time))) + (when (and rem time + (< (- (float-time) time) 1.0)) + (setq delta (+ delta rem))) + (while-no-input + (unwind-protect + (while (< percentage 1) + (redisplay t) + (sleep-for between-scroll) + (setq time-elapsed (+ time-elapsed + (- (float-time) last-time)) + percentage (/ time-elapsed total-time)) + (if (< delta 0) + (pixel-scroll-precision-scroll-down + (ceiling (abs (* (* delta factor) + (/ between-scroll total-time))))) + (pixel-scroll-precision-scroll-up + (ceiling (* (* delta factor) + (/ between-scroll total-time))))) + (setq last-time (float-time))) + (when (< percentage 1) + (set-window-parameter nil 'interpolated-scroll-remainder + (* delta (- 1 percentage))) + (set-window-parameter nil 'interpolated-scroll-remainder-time + (float-time))))))) (defun pixel-scroll-precision-scroll-up (delta) "Scroll the current window up by DELTA pixels."